    // 1、1 参数类型注释
        // 声明函数时，可以给参数添加类型注释，声明函数接受哪些类型的参数。参数类型注释在参数名称之后： 
            // Parameter type annotation
             //类型注释的优先级高于类型推断的优先级
            function greet(name: string   ) { 
                console.log("Hello, " + name.toUpperCase() + "!!");
              }
        // 当参数具有类型注释时，将检查该函数的参数：
            // greet(1)  这里传的参数类型与上面定义的参数类型不一致，报类型错误
            // greet()    就算没给形参添加类型注释，ts也会检测传的参数个数是否正确，如果少传或者多传，在js中是不会报错的，但是在ts中认为这是一个错误

            function greet1(name?: string   ) {  //这里的?:表示可选，即这个参数是可传可不传的
                console.log("Hello, " + name.toUpperCase() + "!!");
              }
              greet1()  //function greet1(name?: string): void  这时候不传参ts也不报错
              function greet2(name = '1'   ) {  //给了函数参数默认值,这里ts会做两件事，1是赋值后的类型推断，推测出参数的类型  2是把参数设置成可选的
                console.log("Hello, " + name.toUpperCase() + "!!");
              } 
              greet2() // function greet2(name?: string): void  所以给了函数参数默认值ts就会给参数加上类型并且设置成可选参数